package ec.edu.ups.cidi.siia.plamdep.analizadorLexico.wordnet;

import java.sql.*;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import ec.edu.ups.cidi.siia.plamdep.interfaces.IConexionBD;
import ec.edu.ups.cidi.siia.plamdep.utils.Log;

/**
 * Clase que permite interactuar con la BD wordnet en Postgres usando un Datasource
 * @author user
 *
 */
public class ConexionBDPostgres implements IConexionBD{
    
    static Connection con  = null;
    static Statement  st   = null;  
    static ResultSet  res  = null; 
    static String     sql  = null;
    static boolean conectado=false;
    /**
     * Devuelve un resultado de una consulta 
     */
    public ConexionBDPostgres()
    {
    	conectar();
    }
    
    public ResultSet consulta(String query)
    {
        ResultSet rs=null;
        try 
        {   Statement sentencia = con.createStatement();
            rs=sentencia.executeQuery(query);
        } catch (SQLException e) { 
            e.printStackTrace();
        }
        return rs;
    }
    /**
     * Ejecuta sentencias sql sobre la BD
     * @param codigo
     */
     public void ejecutar(String codigo){
       
      
            try{
            PreparedStatement pstm = con.prepareStatement(codigo);
            pstm.execute();
             
            pstm.close();
            }catch(Exception e){ e.printStackTrace();
                
            } 
   }
     
     /**
      * Obtiene una conexion a la BD desde el Datasource
      */
  
    
    public void conectar() 
    {
    	String dniDatasource="java:jboss/datasources/plamdepDS";
    	try {
			InitialContext ic = new InitialContext();
			DataSource ds = (DataSource) ic.lookup(dniDatasource);
			con = ds.getConnection();
			
			Log.log(null, Log.MOD_ANLS_LEXICO, Log.LEVEL_SUCESS, ConexionBDPostgres.class, "BASE DE DATOS LEXICA CONECTADA... "+dniDatasource);
			conectado=true;
		} catch (Exception e) {
			Log.log(null, Log.MOD_ANLS_LEXICO, Log.LEVEL_WARNING, ConexionBDPostgres.class, "Error al conectar al Datasource "+dniDatasource);
		}
    }
    
    public void cerrar() {
    	try {
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
    }
    
    public boolean isConectado() {
        
			return conectado;
		
    }
	public String getSqlSinonimos(String palabra, String lema) {
		String sql="select distinct word " +
                " from palabra v1, " +
                " significados s " +
                " where v1.offset in  "+
                
                "(select v2.offset "+
                "	from palabra v2 "+
                "	where upper(v2.word)= upper('"+palabra+"') or "+
                " upper(v2.word)= upper('"+lema+"') ) " +
                
                " and s.offset=v1.offset";
		return sql;
	}
	public String getSqlAntonimos(String palabra) {
		String sql=" select distinct v2.word p2 "
				+ " from "
				+ " 	(select * from relaciones   where relation=33)r,"
				+ "		(select * from palabra where upper(word)=upper('"+palabra+"'))v1,"
				+ "		 palabra v2 "
				+ " where"
				+ "		v1.offset=r.\"sourceSynset\" and"
				+ "		v2.offset=r.\"targetSynset\"";
		return sql;
	}
	public String getSqlSignificados(String palabra) {
		String sql="select s.GLOSS\n" +
                " from significados s, palabra p\n" +
                " where \n" +
                "p.WORD like '"+palabra+"'\n" +
                "and s.GLOSS <> 'NULL'\n" +
                "and  s.OFFSET like p.OFFSET  ";
		return sql;
	}
	public String getSqlTraducciones(String palabra) {
		String sql=" select ing.word, ing.pos\n" +
                "from(\n" +
                "select es1.offset\n" +
                "from  palabra as es1\n" +
                "where es1.word like '"+palabra.toLowerCase()+"') as es,\n" +
                "palabra_eng as ing\n" +
                "where substring(es.offset,5,13) = substring(ing.offset,5,13);";
		return sql;
	}
	
}
